package dao;

import java.util.ArrayList;
import hbt.HibernateUtil;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

import negocio.Producto;

public class ProductoDAO 
{
	private static ProductoDAO instancia = null;
	private static SessionFactory sf = null;
	private Session session = null;
	
	public static ProductoDAO getInstancia()
	{
		if(instancia == null)
		{
			sf = HibernateUtil.getSessionFactory();
			instancia = new ProductoDAO();
		} 
		return instancia;
	}
	
	private Session getSession()
	{
		if(session == null || !session.isOpen())
			session = sf.openSession();
		return session;
	}
	
	public void closeSession(){
		if (session.isOpen()) session.close();
	}
	
	public void persistProducto(Producto producto)
	{
		Session s=getSession();
		s.beginTransaction();
		s.persist(producto);
		s.flush();
		s.getTransaction().commit();
		closeSession();
	}
	
	public void deleteProducto(Producto producto)
	{
		Session s=getSession();
		s.beginTransaction();
		s.delete(producto);
		s.flush();
		s.getTransaction().commit();
	}
	
	public void updateProducto(Producto producto)
	{
		Session s=getSession();
		s.beginTransaction();
		s.update(producto);
		s.getTransaction().commit();
	}
	
	public Producto getProducto(int id_prod)
	{
		Session s=getSession();
		s.beginTransaction();
		Producto p = (Producto) s.get(Producto.class, id_prod);
		s.flush();
		s.getTransaction().commit();
		return p;
	}
	
	public Producto getProducto(String nombre)
	{
		Session s=getSession();
		Producto p = (Producto) 
				s.createQuery("from Producto where nombre = :nombre")
				.setString("nombre", nombre)
				.uniqueResult();
		closeSession();
		return p;
	}
	
	public ArrayList<Producto> getProductos()
	{
		Session s=getSession();
		s.beginTransaction();
		@SuppressWarnings("unchecked")
		ArrayList<Producto> prods =  (ArrayList<Producto>) s.createQuery("from Producto").list();
		s.flush();
		s.getTransaction().commit();
		return prods;
	}

	public int actualizarProducto(String producto) {
		
		Session s = getSession();
		int id = (int) s.createQuery("select p.id from Producto p where p.nombre like :valor ").setParameter("valor", producto).uniqueResult();
		
		return id;
		
		
		
	}
}